/**
 * 加法算式类 - 继承自算式抽象类
 * 
 * 设计特点：
 * 1. 继承Expression抽象类
 * 2. 实现具体的加法运算逻辑
 * 3. 封装加法的业务规则
 * 4. 提供加法特有的操作符
 * 
 * 业务规则：
 * - 加法结果不超过100
 * - 支持负数和正数运算
 */
package edu.scut.oop.exercise.v2;

public class AdditionExpression extends Expression {
    
    /**
     * 构造函数
     * @param num1 操作数1
     * @param num2 操作数2
     * @throws IllegalArgumentException 当加法结果超过100时抛出异常
     */
    public AdditionExpression(int num1, int num2) {
        super(num1, num2);
        
        // 验证加法业务规则：结果不能超过100
        if (this.result > 100) {
            throw new IllegalArgumentException(
                String.format("加法结果不能超过100，但计算结果为%d：%d + %d = %d", 
                            this.result, num1, num2, this.result)
            );
        }
    }
    
    /**
     * 计算加法结果
     * @return 加法结果
     */
    @Override
    public int calculate() {
        return num1 + num2;
    }
    
    /**
     * 判断是否为加法
     * @return 始终返回true
     */
    @Override
    public boolean isAddition() {
        return true;
    }
    
    /**
     * 判断是否为减法
     * @return 始终返回false
     */
    @Override
    public boolean isSubtraction() {
        return false;
    }
    
    /**
     * 获取加法操作符
     * @return "+"字符串
     */
    @Override
    public String getOperatorSymbol() {
        return "+";
    }
    
    /**
     * 验证加法算式是否有效
     * @return true表示有效（结果不超过100），false表示无效
     */
    @Override
    public boolean isValid() {
        return result <= 100 && result == (num1 + num2);
    }
    
    /**
     * 重写setNum1方法，确保修改操作数后仍然满足加法规则
     */
    @Override
    public void setNum1(int num1) {
        int newResult = num1 + this.num2;
        if (newResult > 100) {
            throw new IllegalArgumentException(
                String.format("修改操作数1后加法结果不能超过100：%d + %d = %d", 
                            num1, this.num2, newResult)
            );
        }
        super.setNum1(num1);
    }
    
    /**
     * 重写setNum2方法，确保修改操作数后仍然满足加法规则
     */
    @Override
    public void setNum2(int num2) {
        int newResult = this.num1 + num2;
        if (newResult > 100) {
            throw new IllegalArgumentException(
                String.format("修改操作数2后加法结果不能超过100：%d + %d = %d", 
                            this.num1, num2, newResult)
            );
        }
        super.setNum2(num2);
    }
    
    /**
     * 获取加法特有的描述信息
     * @return 描述字符串
     */
    public String getDescription() {
        return String.format("加法算式：%d + %d = %d", num1, num2, result);
    }
    
    /**
     * 检查加法算式是否可以交换操作数
     * @return true表示可以交换（加法总是可以交换）
     */
    public boolean canSwapOperands() {
        // 加法总是可以交换操作数
        return true;
    }
    
    /**
     * 交换操作数（生成一个结果相同的加法算式）
     * @return 交换操作数后的新加法算式
     */
    public AdditionExpression swapOperands() {
        return new AdditionExpression(num2, num1);
    }
    
    /**
     * 检查两个加法算式是否相似（结果相同但操作数不同）
     * @param other 另一个加法算式
     * @return true表示相似
     */
    public boolean isSimilarTo(AdditionExpression other) {
        return this.result == other.result && !this.equals(other);
    }
}